# EntityInflater.java

    package org.codefilarete.stalactite.engine.runtime.load;

    import java.util.Set;

    import org.codefilarete.stalactite.mapping.EntityMapping;
    import org.codefilarete.stalactite.mapping.RowTransformer;
    import org.codefilarete.stalactite.query.model.Selectable;
    import org.codefilarete.stalactite.sql.ddl.structure.Table;
    import org.codefilarete.stalactite.sql.result.ColumnedRow;

    /**
     * Contract to deserialize a database row to a bean
     */
    public interface EntityInflater<C, I> {

    	EntityMapping<C, I, ?> getEntityMapping();

    	default Class<C> getEntityType() {
    		return getEntityMapping().getClassToPersist();
    	}

    	I giveIdentifier(ColumnedRow row);

    	RowTransformer<C> getRowTransformer();

    	Set<Selectable<?>> getSelectableColumns();

    	/**
    	 * Adapter of a {@link EntityMapping} as a {@link EntityInflater}.
    	 * Implemented as a simple wrapper of a {@link EntityMapping} because methods are very close.
    	 *
    	 * @param <C> entity type
    	 * @param <I> identifier type
    	 * @param <T> table type
    	 */
    	class EntityMappingAdapter<C, I, T extends Table<T>> implements EntityInflater<C, I> {

    		private final EntityMapping<C, I, T> delegate;

    		public EntityMappingAdapter(EntityMapping<C, I, T> delegate) {
    			this.delegate = delegate;
    		}

    		@Override
    		public EntityMapping<C, I, ?> getEntityMapping() {
    			return delegate;
    		}

    		@Override
    		public I giveIdentifier(ColumnedRow row) {
    			return this.delegate.getIdMapping().getIdentifierAssembler().assemble(row);
    		}

    		@Override
    		public RowTransformer<C> getRowTransformer() {
    			return this.delegate.getRowTransformer();
    		}

    		@Override
    		public Set<Selectable<?>> getSelectableColumns() {
    			return (Set) this.delegate.getSelectableColumns();
    		}
    	}

    }